"""
lxml+xpath提取豆瓣图书top250

sudo pip3 install fake_useragent
"""
import requests
from lxml import etree
import time
import random
from fake_useragent import UserAgent

class DoubanSpider:
    def __init__(self):
        self.url = 'https://book.douban.com/top250?start={}'

    def get_html(self, url):
        headers = {'User-Agent': UserAgent(path='fake_useragent.json').random}
        html = requests.get(url=url, headers=headers).text
        # 调用解析函数
        self.parse_html(html)

    def parse_html(self, html):
        """
        解析提取数据
        HTML()从字符串常量解析 HTML 文档。
        返回根节点（或解析器目标返回的结果）。
        此函数可用于在 Python 代码中嵌入“HTML 文字”
        """
        eobj = etree.HTML(html)
        # table_list:[<element table at xxx>,<>,<>,...]
        table_list = eobj.xpath('//table')
        for table in table_list:
            item = {}
            # item['name'] = ['红楼梦']
            '''
             返回一个列表（节点集）或 bool、float 或 string。  
             如果是列表结果，则为元素节点返回 Element， 文本和属性值的字符串
            '''
            name_list = table.xpath('.//div[@class="pl2"]/a/@title')
            item['name'] = name_list[0] if name_list else None
            # 信息
            info_list = table.xpath('.//p[@class="pl"]/text()')
            item['info'] = info_list[0] if info_list else None
            # 评分
            score_list = table.xpath('.//span[@class="rating_nums"]/text()')
            item['score'] = score_list[0] if score_list else None
            # 评价人数
            nums_list = table.xpath('.//span[@class="pl"]/text()')
            item['nums'] = nums_list[0][1:-1].strip()[:-3] if nums_list else None
            # 描述
            comment_list = table.xpath('.//span[@class="inq"]/text()')
            item['comment'] = comment_list[0] if comment_list else None

            print(item)

    def crawl(self):
        for page in range(10):
            start = page * 25
            page_url = self.url.format(start)
            self.get_html(page_url)
            # 控制频率
            time.sleep(random.uniform(0, 2))

if __name__ == '__main__':
    spider = DoubanSpider()
    spider.crawl()



























